package design.patterns.behavioral;

/**
 * 中介者模式
 * 解释：
 * 中介者模式是一种行为设计模式， 能让你减少对象之间混乱无序的依赖关系。
 * 该模式会限制对象之间的直接交互， 迫使它们通过一个中介者对象进行合作。
 */

import java.beans.Customizer;
import java.util.ArrayList;
import java.util.List;

/**
 * 情景
 * 飞机需要降落，但是只有一个可降落的跑道
 */
public class D_Mediator {
    public static void main(String[] args) {
        /* 创建飞机 */
        Airplane airplane1 = new Airplane("飞机-1号");
        Airplane airplane2 = new Airplane("飞机-2号");
        Airplane airplane3 = new Airplane("飞机-3号");
        Airplane airplane4 = new Airplane("飞机-4号");
        Airplane airplane5 = new Airplane("飞机-5号");

        /* 创建塔台 */
        AirplaneController airplaneController = new AirplaneController("塔台1号");
        airplaneController.registerAirplane(airplane1);
        airplaneController.registerAirplane(airplane2);
        airplaneController.registerAirplane(airplane3);
        airplaneController.registerAirplane(airplane4);
        airplaneController.registerAirplane(airplane5);

        /* 飞机询问塔台 */
        //均使用线程进行询问
        new Thread(()->{
            airplaneController.notifyOthers(airplane1,Action.LANDING);//降落
        }).start();

        new Thread(()->{
            airplaneController.notifyOthers(airplane5,Action.PASS_BY);//路过，不予关注
        }).start();

        new Thread(()->{
            airplaneController.notifyOthers(airplane2,Action.FLY);//起飞

        }).start();


    }

}


/**-----
 * 主要有两个类，一个Airplane 一个AirplaneController
 * Airplane（飞机） 用于创建飞机
 * AirplaneController（塔台） 用于通知飞机，进行控制
 *
 */

/**
 * 中介者
 * notifyOthers 阻塞其他飞机进行占用跑道
 * registerAirplane 将飞机链接塔台通知。
 */
interface Mediator{

    /* 阻塞其他飞机进行占用跑道 */
    void notifyOthers(Airplane airplane,String message);

    /* 将飞机链接塔台通知。*/
    void registerAirplane(Airplane airplane);
}

/**
 * 定义飞机的动作
 */
interface Action {
    String FLY = "起飞";
    String LANDING = "降落";
    String PASS_BY = "经过";

}

/**
 * 定义飞机的属性类
 */
class Airplane {
    private Mediator mediator;
    private String name;
    private String action ;

    public Airplane(String name) {
        this.name = name;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    @Override
    public String toString() {
        return "Airplane{" +
                "mediator=" + mediator +
                ", name='" + name + '\'' +
                ", action='" + action + '\'' +
                '}';
    }
}

/**
 * 定义塔台
 *
 */
class AirplaneController implements Mediator{
    private String name;
    public AirplaneController(String name){
        this.name = name;
    }
    List<Airplane> airplaneList = new ArrayList<>();//塔台可通知的飞机

    @Override
    public void notifyOthers(Airplane airplane, String message) {
        airplane.setAction(message);
        switch (airplane.getAction()){
            case Action.FLY:
            case Action.LANDING:
                needArea(airplane,message);
                boolean removeLanding = airplaneList.remove(airplane);
                if (!removeLanding){
                    return;
                }
                break;

            default:
                System.out.println("OtherInfo:非降落、起飞、暂时不关注");
        }

    }
    /* 仅允许一台飞机占用跑道 */
    synchronized void needArea(Airplane airplane,String action){

        try {
            System.out.println(airplane);
            System.out.println(action + "中。。。");
            Thread.sleep(1000);
            System.out.println(action + "成功");

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }


    }

    @Override
    public void registerAirplane(Airplane airplane) {
        airplane.setMediator(this);
        airplaneList.add(airplane);
    }

    @Override
    public String toString() {
        return "Controller{" +
                "name='" + name + '\'' +
                '}';
    }
}